package router

import (
	"fmt"
	"gin/controller"
	"gin/middleware"
	sessionsStore "gin/session"
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	etcd "github.com/teamones-open/etcd-discovery"
	register_route "github.com/teamones-open/go-register-route"
	"net/http"
)

func InitRouter() {
	router := gin.Default()

	// 加载静态模板
	router.LoadHTMLGlob("./tpl/*")

	// 要在路由组之前全局使用「跨域中间件」, 否则OPTIONS会返回404
	router.Use(middleware.Cors())

	// 使用 session(cookie-based)
	router.Use(sessions.Sessions("teamones_pan", sessionsStore.Store))

	router.GET("/", controller.HealthyReturn)

	// 配置静态文件夹路径 第一个参数是api，第二个是文件夹路径
	router.StaticFS("/static", http.Dir("./static"))

	auth := router.Group("auth")
	{
		// 生成token
		auth.POST("/generate_token", controller.GenerateToken)
		// 获取token
		auth.POST("/get_token", controller.GetToken)
	}

	files := router.Group("package")
	{
		// 上传文件更
		files.POST("/upload", controller.UploadFile)
		// 获取指定文件
		files.POST("/select", controller.SelectFileByName)
		// 删除指定文件
		files.POST("/remove", controller.RemoveFileByName)
	}

	panCallback := router.Group("pan_callback")
	{
		panCallback.GET("/auth", controller.PanCallback)
	}

	pan := router.Group("pan")
	{
		// 添加用户
		pan.POST("/add_user", controller.AddPanUser)
		// 更新用户信息
		pan.POST("/update_user", controller.UpdatePanUser)
		// 更新用户Token
		pan.POST("/refresh_all_token", controller.RefreshAllToken)
		// 更新用户Token
		pan.POST("/refresh_token", controller.RefreshToken)
		// 获取授权地址
		pan.POST("/get_authorize_url", controller.GetAuthorizeUrl)
		// web api 登陆授权
		pan.POST("/scan_login", controller.ScanCodeAndLogin)
		// web api 获取所有已经注册分享的账户
		pan.POST("/get_share_login_list", controller.GetShareLoginList)
		// 获取用户指定网盘容量
		pan.POST("/get_volume", controller.GetUserAppointPanVolume)
		// 获取上传文件，预上传、分片上传、创建文件链接，返回上传目录地址
		pan.POST("/get_upload_config", controller.GetCreatePanFileUrl)
		// 上传完记录上传的文件信息
		pan.POST("/record_upload_file", controller.RecordUploadFile)
		// 外包生成分享连接
		pan.POST("/generate_share_url", controller.GenerateShareUrl)
		// 通过分享id 转存到当前用户网盘 获取文件下载链接
		pan.POST("/transfer_share_file", controller.TransferShareFile)
		// 生成文件下载链接
		pan.POST("/generate_download_url", controller.GenerateDownloadUrl)
		// 创建文件夹(该接口没啥用)
		pan.POST("/create", controller.CreatePan)
		// 获取文件列表
		pan.POST("/get_user_appoint_pan_file_list", controller.GetUserAppointPanFileList)
		// 获得登录二维码
		pan.POST("/login_qrcode", controller.GetLoginQrCode)
		// 获得登录数据
		pan.POST("/login_data", controller.GetLoginData)
		// 通过unionId查询panUser
		pan.POST("/get_pan_user_by_union_id", controller.GetPanUserByUnionId)
		// 文件管理
		pan.POST("/file_manage", controller.PanFileManage)
		// 重新生成
		pan.POST("/regenerate_share", controller.RegenerateShare)
		// 查询绑定的网盘用户
		pan.POST("/select_bound_pan_user", controller.SelectBoundPanUser)
		// 设置默认网盘用户
		pan.POST("/set_default_user", controller.SetDefaultUser)
		// 查询网盘用户通过id
		pan.POST("/get_pan_user_by_id", controller.GetPanUserById)
		// 查询企业默认网盘
		pan.POST("/get_current_default_pan_user", controller.GetCurrentDefaultPanUser)
	}

	tools := router.Group("tools")
	{
		// 获取分类列表数据
		tools.POST("/get_category", controller.GetToolsCategoryList)

		// 添加工具
		tools.POST("/add", controller.AddTool)

		// 修改工具
		tools.POST("/update", controller.UpdateTool)

		// 删除工具
		tools.POST("/remove", controller.RemoveTool)

		// 查询工具列表
		tools.POST("/select", controller.ToolsSelect)

		// 把工具添加到DCC
		tools.POST("/add_to_dcc", controller.AddToolsToDCC)

		// 把工具从DCC移除
		tools.POST("/remove_from_dcc", controller.RemoveToolsFromDCC)

		// 查询指定DCC工具列表
		tools.POST("/get_dcc_list", controller.GetDCCToolsList)
	}

	// 上报路由
	err := RegisterRoutes(router)
	if err != nil {
		fmt.Println(err.Error())
	}

	port := viper.GetString("server.port")
	if port != "" {

		// 注册服务到ETCD
		etcdStatus := viper.GetString("etcd.status")
		if etcdStatus == "active" {
			etcdHost := viper.GetString("etcd.host")
			etcdPort := viper.GetString("server.port")
			etcdServerName := viper.GetString("etcd.serverName")
			err := etcd.RegisterServer(etcdHost, etcdPort, etcdServerName)
			if err != nil {
				fmt.Println(err.Error())
			}
		}

		panic(router.Run(":" + port))
	}
	panic(router.Run())
}

// 路由上报注册
func RegisterRoutes(router *gin.Engine) (err error) {
	Routes := router.Routes()
	url := viper.GetString("rotueServer.url")
	serverName := viper.GetString("etcd.serverName")
	err = register_route.Register(Routes, url, serverName)
	return err
}
